// 进行axios二次封装：使用请求和响应拦截器
import axios from 'axios'
import { ElMessage } from 'element-plus'
//引入用户相关的仓库
import useUserStore from '@/store/modules/user'
import router from '@/router'


//创建axios实例
const request = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API, // 基础路径上会携带/api
  timeout: 5000
})

//请求拦截器
request.interceptors.request.use((config) => {
  //config配置对象，有请求头headers属性，经常给服务器端携带公共参数
  //获取用户相关的小仓库，获取仓库内部的token，登录成功后携带给服务器
  const userStore = useUserStore()
  if (userStore.token) {
    config.headers.token = userStore.token
  }
  

  //必须返回配置对象
  return config
})

//响应拦截器
request.interceptors.response.use(
  (response) => {
    const status = response.data.code
    switch (status) {
    case 206:
      // 跳转到登录页
      ElMessage({
        type: 'error',
        message: '无效的Token'
      })
      // 清除token并跳转到登录页
      const userStore = useUserStore()
      userStore.token = ''
      localStorage.removeItem('TOKEN')
      // window.location.href = '/login'
      router.push({ name: 'login', query: { redirect: router.currentRoute.value.path } })
      break
    }
    return response.data
  },
  (error) => {
    //处理网络错误
    let msg = ''
    const status = error.response.status
    switch (status) {
    case 401:
      msg = 'token过期'
      break
    case 403:
      msg = '无权访问'
      break
    case 404:
      msg = '请求地址错误'
      break
    case 500:
      msg = '服务器出现问题'
      break
    default:
      msg = '网络出现问题'
    }

    ElMessage({
      type: 'error',
      message: msg
    })
    //响应拦截器失败的回调需要返回一个失败的Promise对象
    return Promise.reject(error)
  }
)
export default request
